{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "from keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau,TensorBoard\n",
    "from keras.models import Model\n",
    "from keras import backend as K\n",
    "from keras.optimizers import Adam\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "from losses import bce_dice_loss\n",
    "from rssegnet import RSSegVGGNet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # 从训练集取样本\n",
    "# samples_data_root = 'D:/Data/mc_data/train/images/0/'\n",
    "\n",
    "# filenames = np.random.choice(os.listdir(samples_data_root), 1000)\n",
    "# samples = []\n",
    "# for fn in filenames:\n",
    "#     fullname = samples_data_root + fn\n",
    "#     image = Image.open(fullname)\n",
    "#     image_arr = np.array(image)\n",
    "#     samples.append(image_arr)\n",
    "\n",
    "# sample_images = np.array(samples)\n",
    "# print(sample_images.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def adjust_data(img,mask):\n",
    "    mean_ = np.array([96.24618792,104.67673492,99.35844062])\n",
    "    img = (img - mean_) / 255\n",
    "    mask = mask / 255\n",
    "    mask[mask > 0.5] = 1\n",
    "    mask[mask <= 0.5] = 0\n",
    "    return (img,mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_train_generator():\n",
    "    train_data_root = 'D:/Data/AerialImageDataset/train'  # 训练集存放路径\n",
    "\n",
    "    # data augmentation\n",
    "    data_gen_args = dict(rotation_range=180,\n",
    "                        width_shift_range=0.2,\n",
    "                        height_shift_range=0.2,\n",
    "                        shear_range=0.2,\n",
    "                        zoom_range=0.2,\n",
    "                        horizontal_flip=True,\n",
    "                        vertical_flip=True,\n",
    "                        fill_mode='constant',\n",
    "                        cval=0\n",
    "                        )\n",
    "#     data_gen_args = dict()\n",
    "\n",
    "    train_image_datagen = ImageDataGenerator(**data_gen_args)\n",
    "    train_mask_datagen = ImageDataGenerator(**data_gen_args)\n",
    "\n",
    "    seed=1\n",
    "\n",
    "    train_image_generator = train_image_datagen.flow_from_directory(\n",
    "        train_data_root + '/images_clipped',\n",
    "        class_mode=None,\n",
    "        batch_size=16,\n",
    "        seed=seed,\n",
    "        color_mode='rgb',\n",
    "        save_to_dir=train_data_root + '/images_aug',\n",
    "        save_format='jpeg')\n",
    "\n",
    "    train_mask_generator = train_mask_datagen.flow_from_directory(\n",
    "        train_data_root + '/gt_clipped',\n",
    "        class_mode=None,\n",
    "        batch_size=16,\n",
    "        seed=seed,\n",
    "        color_mode='grayscale',\n",
    "        save_to_dir=train_data_root + '/masks_aug',\n",
    "        save_format='jpeg')\n",
    "\n",
    "    # combine generators into one which yields image and masks\n",
    "    train_generator = zip(train_image_generator, train_mask_generator)\n",
    "    \n",
    "    for (image, mask) in train_generator:\n",
    "#         print(image.shape)\n",
    "#         print(mask.shape)\n",
    "        yield adjust_data(image, mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_val_generator():\n",
    "    val_data_root = 'D:/Data/AerialImageDataset/val'  # 验证集存放路径\n",
    "    \n",
    "    # data augmentation\n",
    "    # data_gen_args = dict(rotation_range=0.2,\n",
    "    #                     width_shift_range=0.05,\n",
    "    #                     height_shift_range=0.05,\n",
    "    #                     shear_range=0.05,\n",
    "    #                     zoom_range=0.05,\n",
    "    #                     horizontal_flip=True,\n",
    "    #                     fill_mode='nearest')\n",
    "    data_gen_args = dict()\n",
    "\n",
    "    val_image_datagen = ImageDataGenerator(**data_gen_args)\n",
    "    val_mask_datagen = ImageDataGenerator(**data_gen_args)\n",
    "\n",
    "    seed = 1\n",
    "\n",
    "    val_image_generator = val_image_datagen.flow_from_directory(\n",
    "        val_data_root + '/images_clipped',\n",
    "        class_mode=None,\n",
    "        batch_size=16,\n",
    "        seed=seed,\n",
    "        color_mode='rgb')\n",
    "\n",
    "    val_mask_generator = val_mask_datagen.flow_from_directory(\n",
    "        val_data_root + '/gt_clipped',\n",
    "        class_mode=None,\n",
    "        batch_size=16,\n",
    "        seed=seed,\n",
    "        color_mode='grayscale')\n",
    "\n",
    "    val_generator = zip(val_image_generator, val_mask_generator)\n",
    "    \n",
    "    for (image, mask) in val_generator:\n",
    "#         print(image.shape)\n",
    "#         print(mask.shape)\n",
    "        yield adjust_data(image, mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "image_input (InputLayer)        (None, 256, 256, 3)  0                                            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_1 (Conv2D)               (None, 256, 256, 64) 1792        image_input[0][0]                \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_2 (Conv2D)               (None, 256, 256, 64) 36928       conv2d_1[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2D)  (None, 128, 128, 64) 0           conv2d_2[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_3 (Conv2D)               (None, 128, 128, 128 73856       max_pooling2d_1[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_4 (Conv2D)               (None, 128, 128, 128 147584      conv2d_3[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2D)  (None, 64, 64, 128)  0           conv2d_4[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_5 (Conv2D)               (None, 64, 64, 256)  295168      max_pooling2d_2[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_6 (Conv2D)               (None, 64, 64, 256)  590080      conv2d_5[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_7 (Conv2D)               (None, 64, 64, 256)  590080      conv2d_6[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_3 (MaxPooling2D)  (None, 32, 32, 256)  0           conv2d_7[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_8 (Conv2D)               (None, 32, 32, 512)  1180160     max_pooling2d_3[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_9 (Conv2D)               (None, 32, 32, 512)  2359808     conv2d_8[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_10 (Conv2D)              (None, 32, 32, 512)  2359808     conv2d_9[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_4 (MaxPooling2D)  (None, 16, 16, 512)  0           conv2d_10[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_11 (Conv2D)              (None, 16, 16, 512)  2359808     max_pooling2d_4[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_12 (Conv2D)              (None, 16, 16, 512)  2359808     conv2d_11[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_13 (Conv2D)              (None, 16, 16, 512)  2359808     conv2d_12[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_5 (MaxPooling2D)  (None, 8, 8, 512)    0           conv2d_13[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_14 (Conv2D)              (None, 8, 8, 512)    2359808     max_pooling2d_5[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_1 (Conv2DTrans (None, 16, 16, 256)  1179904     conv2d_14[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_1 (Concatenate)     (None, 16, 16, 768)  0           conv2d_transpose_1[0][0]         \n",
      "                                                                 conv2d_13[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_15 (Conv2D)              (None, 16, 16, 512)  3539456     concatenate_1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_2 (Conv2DTrans (None, 32, 32, 256)  1179904     conv2d_15[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_2 (Concatenate)     (None, 32, 32, 768)  0           conv2d_transpose_2[0][0]         \n",
      "                                                                 conv2d_10[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_16 (Conv2D)              (None, 32, 32, 512)  3539456     concatenate_2[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_3 (Conv2DTrans (None, 64, 64, 128)  589952      conv2d_16[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_3 (Concatenate)     (None, 64, 64, 384)  0           conv2d_transpose_3[0][0]         \n",
      "                                                                 conv2d_7[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_17 (Conv2D)              (None, 64, 64, 256)  884992      concatenate_3[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_4 (Conv2DTrans (None, 128, 128, 64) 147520      conv2d_17[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_4 (Concatenate)     (None, 128, 128, 192 0           conv2d_transpose_4[0][0]         \n",
      "                                                                 conv2d_4[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_18 (Conv2D)              (None, 128, 128, 128 221312      concatenate_4[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_5 (Conv2DTrans (None, 256, 256, 32) 36896       conv2d_18[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_5 (Concatenate)     (None, 256, 256, 96) 0           conv2d_transpose_5[0][0]         \n",
      "                                                                 conv2d_2[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_19 (Conv2D)              (None, 256, 256, 1)  865         concatenate_5[0][0]              \n",
      "==================================================================================================\n",
      "Total params: 28,394,753\n",
      "Trainable params: 28,394,753\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = RSSegVGGNet.build()\n",
    "model.compile(loss=bce_dice_loss, optimizer=Adam(), metrics=['accuracy'])\n",
    "model.summary()\n",
    "model.load_weights(\"building_seg_vgg16_bcedice_0918.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/1000\n",
      "Found 60000 images belonging to 1 classes.\n",
      "Found 60000 images belonging to 1 classes.\n",
      "3749/3750 [============================>.] - ETA: 1s - loss: 0.5261 - acc: 0.9315Found 12000 images belonging to 1 classes.\n",
      "Found 12000 images belonging to 1 classes.\n",
      "3750/3750 [==============================] - 5591s 1s/step - loss: 0.5262 - acc: 0.9315 - val_loss: 0.9074 - val_acc: 0.8621\n",
      "Epoch 2/1000\n",
      "3750/3750 [==============================] - 3532s 942ms/step - loss: 0.6489 - acc: 0.9126 - val_loss: 0.7738 - val_acc: 0.8839\n",
      "Epoch 3/1000\n",
      "3750/3750 [==============================] - 3530s 941ms/step - loss: 0.5908 - acc: 0.9217 - val_loss: 0.7297 - val_acc: 0.8942\n",
      "Epoch 4/1000\n",
      "3750/3750 [==============================] - 3527s 941ms/step - loss: 0.5653 - acc: 0.9256 - val_loss: 0.7296 - val_acc: 0.8911\n",
      "Epoch 5/1000\n",
      "3750/3750 [==============================] - 3526s 940ms/step - loss: 0.5528 - acc: 0.9273 - val_loss: 0.7005 - val_acc: 0.8987\n",
      "Epoch 6/1000\n",
      "3750/3750 [==============================] - 3529s 941ms/step - loss: 0.5514 - acc: 0.9278 - val_loss: 0.7379 - val_acc: 0.8919\n",
      "Epoch 7/1000\n",
      "3750/3750 [==============================] - 3530s 941ms/step - loss: 0.5368 - acc: 0.9298 - val_loss: 0.7269 - val_acc: 0.8911\n",
      "Epoch 8/1000\n",
      "3750/3750 [==============================] - 3534s 942ms/step - loss: 0.5284 - acc: 0.9309 - val_loss: 0.7527 - val_acc: 0.8876\n",
      "Epoch 9/1000\n",
      "3750/3750 [==============================] - 3533s 942ms/step - loss: 0.5275 - acc: 0.9311 - val_loss: 0.6956 - val_acc: 0.8987\n",
      "Epoch 10/1000\n",
      "3750/3750 [==============================] - 3530s 941ms/step - loss: 0.5172 - acc: 0.9324 - val_loss: 0.6575 - val_acc: 0.9082\n",
      "Epoch 11/1000\n",
      "3750/3750 [==============================] - 4069s 1s/step - loss: 0.5149 - acc: 0.9330 - val_loss: 0.7122 - val_acc: 0.8943\n",
      "Epoch 12/1000\n",
      "3750/3750 [==============================] - 3951s 1s/step - loss: 0.5132 - acc: 0.9331 - val_loss: 0.7661 - val_acc: 0.8792\n",
      "Epoch 13/1000\n",
      "3750/3750 [==============================] - 3831s 1s/step - loss: 0.5066 - acc: 0.9339 - val_loss: 0.6842 - val_acc: 0.9009\n",
      "Epoch 14/1000\n",
      "3750/3750 [==============================] - 3550s 947ms/step - loss: 0.5045 - acc: 0.9344 - val_loss: 0.6993 - val_acc: 0.8958\n",
      "Epoch 15/1000\n",
      "3750/3750 [==============================] - 3553s 948ms/step - loss: 0.5021 - acc: 0.9347 - val_loss: 0.6893 - val_acc: 0.9005\n",
      "Epoch 16/1000\n",
      "3750/3750 [==============================] - 3659s 976ms/step - loss: 0.4988 - acc: 0.9352 - val_loss: 0.7339 - val_acc: 0.8940\n",
      "Epoch 17/1000\n",
      "3750/3750 [==============================] - 4075s 1s/step - loss: 0.4973 - acc: 0.9354 - val_loss: 0.6874 - val_acc: 0.8991\n",
      "Epoch 18/1000\n",
      "3750/3750 [==============================] - 3857s 1s/step - loss: 0.4958 - acc: 0.9355 - val_loss: 0.7158 - val_acc: 0.8924\n",
      "Epoch 19/1000\n",
      "3750/3750 [==============================] - 3549s 946ms/step - loss: 1.1898 - acc: 0.8759 - val_loss: 1.2485 - val_acc: 0.8754\n",
      "Epoch 20/1000\n",
      "3750/3750 [==============================] - 3551s 947ms/step - loss: 1.0895 - acc: 0.8815 - val_loss: 1.2489 - val_acc: 0.8793\n",
      "Epoch 21/1000\n",
      "3750/3750 [==============================] - 3541s 944ms/step - loss: 0.5307 - acc: 0.9320 - val_loss: 0.6804 - val_acc: 0.9024\n",
      "Epoch 22/1000\n",
      "3750/3750 [==============================] - 3539s 944ms/step - loss: 0.4822 - acc: 0.9376 - val_loss: 0.6856 - val_acc: 0.9014\n",
      "Epoch 23/1000\n",
      "3750/3750 [==============================] - 3541s 944ms/step - loss: 0.4769 - acc: 0.9383 - val_loss: 0.6960 - val_acc: 0.9005\n",
      "Epoch 24/1000\n",
      "3750/3750 [==============================] - 3544s 945ms/step - loss: 0.4735 - acc: 0.9387 - val_loss: 0.6824 - val_acc: 0.9013\n",
      "Epoch 25/1000\n",
      "3750/3750 [==============================] - 3541s 944ms/step - loss: 0.4712 - acc: 0.9390 - val_loss: 0.6644 - val_acc: 0.9063\n",
      "Epoch 26/1000\n",
      "3750/3750 [==============================] - 3547s 946ms/step - loss: 0.4711 - acc: 0.9391 - val_loss: 0.6838 - val_acc: 0.9007\n",
      "Epoch 27/1000\n",
      "3750/3750 [==============================] - 3541s 944ms/step - loss: 0.4682 - acc: 0.9394 - val_loss: 0.6860 - val_acc: 0.9005\n",
      "Epoch 28/1000\n",
      "3750/3750 [==============================] - 3524s 940ms/step - loss: 0.4680 - acc: 0.9394 - val_loss: 0.6941 - val_acc: 0.9003\n",
      "Epoch 29/1000\n",
      "3750/3750 [==============================] - 3530s 941ms/step - loss: 0.4672 - acc: 0.9396 - val_loss: 0.6946 - val_acc: 0.8988\n",
      "Epoch 30/1000\n",
      "3750/3750 [==============================] - 3531s 942ms/step - loss: 0.4662 - acc: 0.9396 - val_loss: 0.6753 - val_acc: 0.9030\n",
      "Epoch 31/1000\n",
      "3750/3750 [==============================] - 3522s 939ms/step - loss: 0.4646 - acc: 0.9400 - val_loss: 0.6796 - val_acc: 0.9021\n",
      "Epoch 32/1000\n",
      "3750/3750 [==============================] - 3535s 943ms/step - loss: 0.4644 - acc: 0.9400 - val_loss: 0.6766 - val_acc: 0.9027\n",
      "Epoch 33/1000\n",
      "3750/3750 [==============================] - 3544s 945ms/step - loss: 0.4638 - acc: 0.9399 - val_loss: 0.6784 - val_acc: 0.9029\n",
      "Epoch 34/1000\n",
      "3750/3750 [==============================] - 3665s 977ms/step - loss: 0.4641 - acc: 0.9399 - val_loss: 0.6738 - val_acc: 0.9034\n",
      "Epoch 35/1000\n",
      "3750/3750 [==============================] - 4126s 1s/step - loss: 0.4640 - acc: 0.9400 - val_loss: 0.6755 - val_acc: 0.9034\n",
      "Epoch 36/1000\n",
      "3750/3750 [==============================] - 3543s 945ms/step - loss: 0.4633 - acc: 0.9400 - val_loss: 0.6807 - val_acc: 0.9011\n",
      "Epoch 37/1000\n",
      "3750/3750 [==============================] - 3538s 943ms/step - loss: 0.4630 - acc: 0.9401 - val_loss: 0.6793 - val_acc: 0.9021\n",
      "Epoch 38/1000\n",
      "3750/3750 [==============================] - 3538s 943ms/step - loss: 0.4633 - acc: 0.9401 - val_loss: 0.6760 - val_acc: 0.9035\n",
      "Epoch 39/1000\n",
      "3750/3750 [==============================] - 3555s 948ms/step - loss: 0.4625 - acc: 0.9402 - val_loss: 0.6646 - val_acc: 0.9054\n",
      "Epoch 40/1000\n",
      "3750/3750 [==============================] - 3547s 946ms/step - loss: 0.4634 - acc: 0.9400 - val_loss: 0.6764 - val_acc: 0.9033\n",
      "Epoch 41/1000\n",
      "3750/3750 [==============================] - 3876s 1s/step - loss: 0.4637 - acc: 0.9400 - val_loss: 0.6695 - val_acc: 0.9037\n",
      "Epoch 42/1000\n",
      "3750/3750 [==============================] - 3964s 1s/step - loss: 0.4635 - acc: 0.9400 - val_loss: 0.6810 - val_acc: 0.9017\n",
      "Epoch 43/1000\n",
      "3750/3750 [==============================] - 3570s 952ms/step - loss: 0.4628 - acc: 0.9401 - val_loss: 0.6803 - val_acc: 0.9027\n",
      "Epoch 44/1000\n",
      "3750/3750 [==============================] - 3576s 954ms/step - loss: 0.4631 - acc: 0.9400 - val_loss: 0.6741 - val_acc: 0.9034\n",
      "Epoch 45/1000\n",
      "3750/3750 [==============================] - 3604s 961ms/step - loss: 0.4633 - acc: 0.9401 - val_loss: 0.6762 - val_acc: 0.9023\n",
      "Epoch 46/1000\n",
      "3750/3750 [==============================] - 4053s 1s/step - loss: 0.4624 - acc: 0.9401 - val_loss: 0.6821 - val_acc: 0.9013\n",
      "Epoch 47/1000\n",
      "3750/3750 [==============================] - 5923s 2s/step - loss: 0.4618 - acc: 0.9403 - val_loss: 0.6763 - val_acc: 0.9034\n",
      "Epoch 48/1000\n",
      "3750/3750 [==============================] - 3836s 1s/step - loss: 0.4624 - acc: 0.9401 - val_loss: 0.6782 - val_acc: 0.9028\n",
      "Epoch 49/1000\n",
      "3750/3750 [==============================] - 3740s 997ms/step - loss: 0.4627 - acc: 0.9401 - val_loss: 0.6777 - val_acc: 0.9020\n",
      "Epoch 50/1000\n",
      "3750/3750 [==============================] - 3684s 982ms/step - loss: 0.4628 - acc: 0.9401 - val_loss: 0.6774 - val_acc: 0.9026\n",
      "Epoch 51/1000\n",
      "3750/3750 [==============================] - 3610s 963ms/step - loss: 0.4635 - acc: 0.9400 - val_loss: 0.6810 - val_acc: 0.9023\n",
      "Epoch 52/1000\n",
      "3750/3750 [==============================] - 3588s 957ms/step - loss: 0.4637 - acc: 0.9400 - val_loss: 0.6777 - val_acc: 0.9025\n",
      "Epoch 53/1000\n",
      "3750/3750 [==============================] - 3560s 949ms/step - loss: 0.4627 - acc: 0.9401 - val_loss: 0.6766 - val_acc: 0.9032\n",
      "Epoch 54/1000\n",
      "3750/3750 [==============================] - 3560s 949ms/step - loss: 0.4629 - acc: 0.9401 - val_loss: 0.6766 - val_acc: 0.9025\n",
      "Epoch 55/1000\n",
      "3750/3750 [==============================] - 3567s 951ms/step - loss: 0.4631 - acc: 0.9401 - val_loss: 0.6754 - val_acc: 0.9030\n",
      "Epoch 56/1000\n",
      "3750/3750 [==============================] - 3558s 949ms/step - loss: 0.4621 - acc: 0.9402 - val_loss: 0.6795 - val_acc: 0.9024\n",
      "Epoch 57/1000\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3750/3750 [==============================] - 3761s 1s/step - loss: 0.4626 - acc: 0.9402 - val_loss: 0.6709 - val_acc: 0.9040\n"
     ]
    }
   ],
   "source": [
    "callback_list = [\n",
    "    EarlyStopping(\n",
    "        monitor='acc',\n",
    "        patience=10,\n",
    "    ),\n",
    "    ModelCheckpoint(\n",
    "        filepath='building_seg_vgg16_bcedice_0918.h5',\n",
    "        monitor='val_loss',\n",
    "        save_best_only=True,\n",
    "    ),\n",
    "    ReduceLROnPlateau(\n",
    "        monitor='val_loss',\n",
    "        factor=0.1,\n",
    "        patience=10,\n",
    "    ),\n",
    "    TensorBoard(\n",
    "        log_dir = 'logs'\n",
    "    ),\n",
    "]\n",
    "\n",
    "history = model.fit_generator(make_train_generator(),\n",
    "                              epochs=1000,\n",
    "                              steps_per_epoch=int(60000/16),\n",
    "                              validation_data=make_val_generator(),\n",
    "                              validation_steps=int(12000/16),\n",
    "                              callbacks=callback_list,\n",
    "                              verbose=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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vPVxxgZmGYYRD3bt2sU555xDRUUFqsqf/vSnpBD8upL6JQihtBS++91EW2EYRqrTvn17lixZkmgz4k5axd5RtZq+YRhGTaSV6O/cCXv3mugbhmFEIq1E30bjGoZh1Exaib710TcMw6iZtBR9G41rGKnJWWeddchAqwceeIDrr7++xuNat24NwObNmxk1alTEc0frDv7AAw9QFhRFbtiwYXz99dd+TE8Z0lL0raZvGKnJ6NGjmT69+uD96dOnM3r0aF/HH3XUUbz00ku1vn6o6M+ZM4f27dvX+nzJSFp12SwthVatoE2bRFtiGKnPTTdBmEjCdaJvX/AiGodl1KhR3HHHHezbt4/mzZuzceNGNm/ezMCBA9m1axfDhw9nx44d7N+/n7vvvpvhw6tHed+4cSPnn38+H3zwAXv27OHKK69k9erV9OjR42DoA4DrrruOxYsXs2fPHkaNGsWvf/1rHnroITZv3szZZ59NTk4O8+fPJz8/n6KiInJycrj//vsPRukcN24cN910Exs3bmTo0KEMHDiQhQsX0qlTJ/7xj38cDKgWYPbs2dx9992Ul5eTnZ1NYWEhRxxxBLt27WLixIkUFRUhItx5552MHDmS1157jdtvv53KykpycnKYN29e3L6DtBJ9mxvXMFKb7Oxs+vfvz2uvvcbw4cOZPn06l1xyCSJCixYtmDlzJm3btmXbtm2ceuqpXHjhhREDmD3++ONkZWWxYsUKVqxYQb9+/Q7umzp1KocddhiVlZWcc845rFixghtuuIH777+f+fPnk5OTU+1cS5Ys4emnn+b9999HVRkwYABnnnkmHTp0YP369bzwwgs88cQTXHzxxbz88stcdtll1Y4fOHAg7733HiLCk08+yb333ssf/vAHfvOb39CuXTtWrlwJwI4dO9i6dStXX301CxYsoGvXrnGPz5NWom999A0jftRUI69PAi6egOgHateqyu23386CBQto1KgRn3/+OV988QVHHnlk2PMsWLCAG264AYDevXvTu3fvg/tmzJjBtGnTqKiooLS0lNWrV1fbH8o777zDRRdddDDS54gRI3j77be58MIL6dq1K337ullgI4VvLikp4ZJLLqG0tJTy8nK6du0KwBtvvFHNndWhQwdmz57N9773vYN54h1+Oe18+taIaxipzQ9+8APmzZvH0qVL2bNnz8EaemFhIVu3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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "acc = history.history['acc']\n",
    "val_acc = history.history['val_acc']\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "epochs = range(1, len(acc) + 1)\n",
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.legend()\n",
    "plt.figure()\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
